package com.cpems.system.service;

import com.cpems.system.domain.vo.ElectricityUVo;
import com.cpems.system.domain.vo.ElectricityIVo;
import com.cpems.system.domain.vo.ElectricityPVo;
import com.cpems.system.domain.vo.ElectricityWVo;
import com.cpems.system.domain.vo.EnergyStatisticsVo;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 数据查询服务接口
 * 用于替代MQTT和RabbitMQ，直接从数据库查询电力数据
 * 
 * @author cpems
 * @date 2025-01-10
 */
public interface IDataQueryService {

    /**
     * 根据设备ID查询最新电压值
     * @param clientId 设备ID
     * @return 最新电压值
     */
    ElectricityUVo getLatestVoltageByClientId(String clientId);

    /**
     * 根据设备ID和时间范围查询电压值列表
     * @param clientId 设备ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 电压值列表
     */
    List<ElectricityUVo> getVoltageByClientIdAndTimeRange(String clientId, Date startTime, Date endTime);

    /**
     * 根据设备ID查询最新电流值
     * @param clientId 设备ID
     * @return 最新电流值
     */
    ElectricityIVo getLatestCurrentByClientId(String clientId);

    /**
     * 根据设备ID和时间范围查询电流值列表
     * @param clientId 设备ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 电流值列表
     */
    List<ElectricityIVo> getCurrentByClientIdAndTimeRange(String clientId, Date startTime, Date endTime);

    /**
     * 根据设备ID查询最新功率值
     * @param clientId 设备ID
     * @return 最新功率值
     */
    ElectricityPVo getLatestPowerByClientId(String clientId);

    /**
     * 根据设备ID和时间范围查询功率值列表
     * @param clientId 设备ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 功率值列表
     */
    List<ElectricityPVo> getPowerByClientIdAndTimeRange(String clientId, Date startTime, Date endTime);

    /**
     * 根据设备ID查询最新用电量值
     * @param clientId 设备ID
     * @return 最新用电量值
     */
    ElectricityWVo getLatestEnergyByClientId(String clientId);

    /**
     * 根据设备ID和时间范围查询用电量值列表
     * @param clientId 设备ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 用电量值列表
     */
    List<ElectricityWVo> getEnergyByClientIdAndTimeRange(String clientId, Date startTime, Date endTime);

    /**
     * 根据设备编号查询能耗统计数据
     * @param equipmentSn 设备编号
     * @param energyType 能源类型（0：电，1：水）
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 能耗统计数据列表
     */
    List<EnergyStatisticsVo> getEnergyStatistics(String equipmentSn, String energyType, Date startTime, Date endTime);

    /**
     * 获取多个设备的最新电力数据汇总
     * @param clientIds 设备ID列表
     * @return 设备ID与最新数据的映射
     */
    Map<String, Map<String, Object>> getLatestDataSummary(List<String> clientIds);

    /**
     * 根据时间范围获取所有设备的电力数据统计
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 统计数据
     */
    Map<String, BigDecimal> getAllDevicesStatistics(Date startTime, Date endTime);

    /**
     * 获取指定设备的实时数据（最新的电压、电流、功率、用电量）
     * @param clientId 设备ID
     * @return 实时数据映射
     */
    Map<String, Object> getRealTimeData(String clientId);

    /**
     * 批量插入电压数据
     * @param voltageList 电压数据列表
     * @return 插入成功数量
     */
    int batchInsertVoltageData(List<ElectricityUVo> voltageList);

    /**
     * 批量插入电流数据
     * @param currentList 电流数据列表
     * @return 插入成功数量
     */
    int batchInsertCurrentData(List<ElectricityIVo> currentList);

    /**
     * 批量插入功率数据
     * @param powerList 功率数据列表
     * @return 插入成功数量
     */
    int batchInsertPowerData(List<ElectricityPVo> powerList);

    /**
     * 批量插入用电量数据
     * @param energyList 用电量数据列表
     * @return 插入成功数量
     */
    int batchInsertEnergyData(List<ElectricityWVo> energyList);

    /**
     * 定时任务：清理过期数据
     * @param daysToKeep 保留天数
     * @return 清理的记录数
     */
    int cleanExpiredData(int daysToKeep);

    /**
     * 获取设备状态（根据最新数据时间判断设备是否在线）
     * @param clientId 设备ID
     * @param timeoutMinutes 超时分钟数
     * @return true-在线，false-离线
     */
    boolean isDeviceOnline(String clientId, int timeoutMinutes);
}